var login_password_box = $("#login_password_box");//文本框外部容器
var login_input = login_password_box.find("input");//文本框集合
var login_input_length = login_input.length;//文本框集合长度
var Pin = '123';

var input_state = function(input_box, input_number){//获取焦点方法，参数1：密码框外部容器对象；参数2：可用文本框索引
    var Current_element = input_box.find("input").eq(input_number);
    Current_element.removeAttr("disabled");
    Current_element.removeClass("login_paw_input_a_default").addClass("login_paw_input_a_active");
    Current_element.focus();
    Current_element.siblings().attr("disabled","disabled");
    Current_element.siblings().removeClass("login_paw_input_a_active").addClass("login_paw_input_a_default");
};

$(function($) {
    load();//验证是否安装服务及UKEY是否插入

    input_state(login_password_box,0);

    login_input.on('input propertychange',function(){//光标自动后移事件

        var login_input_index = $(this).index();
        var all_input_val = true;

        if($(this).val().length != "" && login_input_index != login_input_length-1){

            var next_input_index = $(this).next().index();
            input_state(login_password_box,next_input_index);
            
        }else{
                
                Pin = "";
                for(var i=0; i < login_input_length; i++){
                    if(login_input.eq(i).val() == ""){
                        all_input_val = false;
                        return false;
                    }
                    Pin = Pin + login_password_box.find("input").eq(i).val();
                    Pin = Pin.toString();
                };
                if(all_input_val){
                    login_onclick(Pin,input_state);
                }else{
                    $("#login_password_box input").val("");
                    input_state(login_password_box,0);
                }
        }

    });

    login_input.keydown(function(event){//删除密码方法
        if(event.keyCode == 8 || event.keyCode == 46){
            if($(this).val() != ""){
                $(this).val("")
            }else{
                if($(this).index() != 0){
                    var prev_input =  $(this).prev();
                    var prev_input_index = prev_input.index();
                    input_state(login_password_box,prev_input_index);
                    //prev_input.val("");
                }
            }
        }else{
            if($(this).val() != ""){
                input_state(login_password_box,$(this).index()+1);
            };
        }
    });
});



var bConnect = 0;//服务安装验证变量
var websocket_server = function(bConnect){//服务安装验证方法，唯一参数为服务验证变量，0为没有发现服务，1为服务已安装，通讯成功
    if (bConnect == 0) {//判断是否安装了服务程序，如果没有安装提示用户安装
        console.log("您尚未安装服务端，请根据说明安装。");
        $("#Ukey_password").hide();
        $("#Server_side").show();
        return false;
    };
};

function load() {//验证是否安装服务及UKEY是否插入
    //如果是IE10及以下浏览器，则跳过不处理
    if (navigator.userAgent.indexOf("MSIE") > 0 && !navigator.userAgent.indexOf("opera") > -1) return;
    try {
        var s_pnp = new SoftKey3W();
        s_pnp.Socket_UK.onopen = function () {//websocket开启成功后执行回调函数
            bConnect = 1; //将服务状态变量设为真
            websocket_server(bConnect);
        };
        //在使用事件插拨时，注意，一定不要关掉Sockey，否则无法监测事件插拨
        s_pnp.Socket_UK.onmessage = function got_packet(Msg) {
            var PnpData = JSON.parse(Msg.data);
            if (PnpData.type == "PnpEvent") //如果是插拨事件处理消息
            {
                if (PnpData.IsIn) {
                    console.log("UKEY已被插入，被插入的锁的路径是：" + PnpData.DevicePath);
                    $("#ukey_pull_out").hide();
                    $("#not_found_ukey").hide();
                    $("#Ukey_password").show();
                } else {
                    console.log("UKEY已被拨出，被拨出的锁的路径是：" + PnpData.DevicePath);
                    $("#Ukey_password").hide();
                    $("#ukey_pull_out").show();
                }
            }
        }
    } catch (e) {
        alert(e.name + ": " + e.message);
        return false;
    };
}

var digitArray = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f');

function toHex(n) {

    var result = ''
    var start = true;

    for (var i = 32; i > 0;) {
        i -= 4;
        var digit = (n >> i) & 0xf;

        if (!start || digit != 0) {
            start = false;
            result += digitArray[digit];
        }
    }

    return (result == '' ? '0' : result);
}

function Server_request(server_url,Decrypted_data){//向服务端发送解密后的数据，并根据服务端反馈判断是否执行登录操作。参数1：服务端解密数据验证地址；参数2：前端解密后的数据。
    $.post(server_url, { "Decrypted_data": Decrypted_data}, function(data){
        var login_obj = JSON.parse(data);
        if(login_obj.Result){
            console.log('可以登录');
            //window.location.href="http://localhost/szsy/index_city.html"    
        }else{
            console.log('不可以登录');
            swal({
                title: '您尚未获得登录权限',
                type: 'error',
                timer: '1200',
                showConfirmButton: false,
                showCancelButton: false
            })
        }
    });
}
function login_onclick(Pin,input_state) {//请求发送主体函数

    //如果是IE10及以下浏览器，则使用AVCTIVEX控件的方式
    try {
        var DevicePath, mylen, ret, keyid, username, mykey, outstring, address, mydata, i, InString, versionex,
            version,server_info;
        var PubKeyX, PubKeyY, PriKey, UserName, Pin;

        var s_simnew1 = new SoftKey3W(); //创建UK类

        s_simnew1.Socket_UK.onopen = function () {//这里调用ResetOrder将计数清零，这样，消息处理处就会收到0序号的消息，通过计数及序号的方式，从而生产流程
            s_simnew1.ResetOrder(); 
        }

        var UK_id = '';

        s_simnew1.Socket_UK.onmessage = function got_packet(Msg) {
            var UK_Data = JSON.parse(Msg.data);
            if (UK_Data.type != "Process") return; //如果不是流程处理消息，则跳过
            switch (UK_Data.order) {
                case 0:
                    {
                        s_simnew1.FindPort(0); //查找加密锁
                    }
                    break; 
                case 1:
                    {
                        if (UK_Data.LastError != 0) {
                            console.log("未发现加密锁，请插入加密锁");
                            $("#Ukey_password").hide();
                            $("#not_found_ukey").show();
                            s_simnew1.Socket_UK.close();
                            return false;
                        }
                        DevicePath = UK_Data.return_value; //UK的路径
                        s_simnew1.GetChipID(DevicePath); //请求返回芯片唯一ID
                    }
                    break;
                case 2:
                    {
                        if (UK_Data.LastError != 0) {
                            console.log("返回芯片唯一ID时出现错误，错误码为：" + UK_Data.LastError.toString());
                            s_simnew1.Socket_UK.close();
                            return false;
                        }
                        outstring = UK_Data.return_value;//Ukeyid
                        UK_id = outstring;
                        console.log("成功获取UkeyID：" + outstring);

                        s_simnew1.YtSetPin(Pin, Pin, DevicePath); //设置Pin码
                    }
                    break;
                case 3:
                    {
                        if (UK_Data.LastError != 0) {
                            console.log("UKEY密码不正确，请重新输入");
                            s_simnew1.Socket_UK.close();
                            $("#login_password_box input").val("");
                            input_state(login_password_box,0);
                            swal({
                                title: 'UKEY密码不正确，请重新输入！',
                                type: 'error',
                                confirmButtonText: '知道了',
                                showConfirmButton: true,
                                confirmButtonColor: '#f4516c'
                            })
                            return false;
                        }
                        console.log("UKEY密码验证成功.");
                        swal({
                            title: 'UKEY密码验证成功',
                            type: 'success',
                            timer: '1200',
                            showConfirmButton: false,
                            showCancelButton: false
                        })
                        //返回设置在锁中的身份
                        s_simnew1.GetSm2UserName(DevicePath);
                    }
                    break;
                case 4:
                    {
                        if (UK_Data.LastError != 0) {
                            window.console.log("返回设置在锁中的用户身份时出现错误，错误码为：" + UK_Data.LastError.toString());
                            s_simnew1.Socket_UK.close();
                            return false;
                        }
                        outstring = UK_Data.return_value;
                        console.log("UK中的用户身份：" + outstring);
                        
                        $.post("server_Receive.php", { "UkeyId": UK_id}, function(data){//服务端反馈，向服务端发送UKeyID,服务端可以根据UK_id加密数据并返回
                            var Server_Feedback = JSON.parse(data);

                            console.warn("服务端加密的数据: " + Server_Feedback.encryption);
                            console.warn("服务端返回的ukid: " + Server_Feedback.UkeyId);

                            //对数据进行解密,使用默认的PIN码
                            s_simnew1.SM2_DecString( Server_Feedback.encryption, Pin, DevicePath);
                        });

                    }
                    break;
                case 5:
                    {
                        if (UK_Data.LastError != 0) {
                            window.console.log("对数据进行解密时出现错误，错误码为：" + UK_Data.LastError.toString());
                            s_simnew1.Socket_UK.close();
                            return false;
                        }
                        outstring = UK_Data.return_value;
                        console.log("已成功对数据进行解密，解密后的数据是：" + outstring);

                        Server_request('login1.php',outstring);//第一个参数为请求地址，第二个参数为前端解密后数据
                        
                        s_simnew1.Socket_UK.close();
                    }
                    break;
            }
        }

        s_simnew1.Socket_UK.onclose = function () {

        }
        return true;
    } catch (e) {
        console.log(e.name + ": " + e.message);
        return false;
    }

}

$(".login_main_box").height($(window).height());
$(".login_main_box").width($(window).width());